(function ($, __, gm) {
    "use strict";
    __.register_autoload("house.post", function () {


        var $form = $("#house-post-form"),
            $house_name = $("#house-name").validate_on_keyup(__.Regex.word(4, 128), "Tên nhà trọ hợp lệ từ 4 - 128 kí tự"),
            $intro = $("#intro").validate_on_keyup(__.Regex.word(10, 512), "Giới thiệu cần dài khoảng 10 - 500 kí tự"),
            $house_address = $("#house-address", $form).validate_on_keyup(__.Regex.word(5, 128), "Địa chỉ nên từ 10 -128 kí tự"),
            $house_position = $("#house-position", $form),
            $city = $("#city", $form),
            $district = $("#district", $form),
            $ward = $("#ward", $form),
            $opening_hour = $("#opening-hour", $form),

            $map_wrap = $("#map-group"),
            $map_canvas = $("#map-canvas"),
            $submit_position = $("#submit-position"),
            $cancel_position = $("#cancel-position"),
            $map_sheller = $("#map-sheller"),
            $anchor_sheller = $("#anchor-sheller"),
            $anchor_selector_outer = $("#anchor-selector-outer"),
            $anchor_selector_close = $("#anchor-selector-close"),
            $anchor_loading = $("#anchor-selector-loading"),
            $anchor_id = $("#anchor-id"),
            $anchor_name = $("#anchor-name");

        var HOUSE_POSITION_MODE = 1,
            ANCHOR_POSITION_MODE = 2,
            map_mode = HOUSE_POSITION_MODE;

        // Cache các phần tử select hiện tại

        __.g_cache.store("city" + $city.val(), $district.html());
        __.g_cache.store("district" + $district.val(), $ward.html());


        // On change cities, districts, wards
        $city.change(function () {
            var city_id = $city.val();
            if (__.g_cache.has("city" + city_id)) {
                $district.update_select_html(__.g_cache.store("city" + city_id));
            } else {
                $.post(__.make_url('get/districts'), {
                    csrf_token: __.csrf_token(),
                    id: city_id
                }, function (response) {
                    __.g_cache.store("city" + city_id, response.html);
                    $city.change();
                });
            }
        });
        // Gọi change() lần đầu để load quận/huyện
        $city.change();

        $district.change(function () {
            var district_id = $district.val();
            if (__.g_cache.has("district" + district_id)) {
                $ward.update_select_html(__.g_cache.store("district" + district_id));
            } else {
                $.post(__.make_url('get/wards'), {
                    csrf_token: __.csrf_token(),
                    id: district_id
                }, function (response) {
                    __.g_cache.store("district" + district_id, response.html);
                    $district.change();
                });
            }
        });

        // Load danh sách điểm mốc
        $anchor_loading.hide();
        $anchor_selector_outer.hide();

        function show_anchor_selector() {
            $anchor_selector_outer.slideDown(800);
            $anchor_selector_close.show(500);

            var anchor_id = $anchor_id.val();
            $('ul li', $anchor_selector_outer).removeClass('current');
            $('ul li[data-id=' + anchor_id + ']', $anchor_selector_outer).addClass('current');
        }

        function hide_anchor_selector() {
            $anchor_selector_outer.slideUp(500);
            $anchor_selector_close.hide(500);
        }

        $anchor_sheller.click (function () {
            var cache_name = "anchor_by_ward_" + $ward.val();
            if (__.g_cache.has(cache_name)) {
                $anchor_selector_outer.html(__.g_cache.store(cache_name));
                show_anchor_selector();
            } else {
                $anchor_loading.fadeIn(300);
                $.post(__.make_url("get/anchors"), {
                    csrf_token: __.csrf_token(),
                    id: $ward.val()
                }, function (response) {
                    __.g_cache.store(cache_name, response.html);
                    $anchor_sheller.click();
                    $anchor_loading.fadeOut(500);
                });
            }
            return false;
        });

        $anchor_selector_close.click(function () {
            hide_anchor_selector();
            return false;
        });

        // Click vao diem moc
        $anchor_selector_outer.on('click', 'ul li', function () {
            var $li = $(this);
            $anchor_id.val($li.data('id'));
            $anchor_name.val($('.anchor-name', $li).text())
                .attr('title', $('.anchor-address', $li).text());

            hide_anchor_selector();
        });

        // pre-load map
        $map_canvas.parent().height("100%");
        var map_id = gm.make_map({ element: $map_canvas}),
            marker_options = {
                map: map_id, draggable: true,
                icon: __.make_url("img/building.png"),
                title: "Di chuyến đến địa chỉ nhà trọ của bạn"
            };

        if ($house_position.val().length > 0) {
            marker_options.position = $house_position.val();
        }

        var    maker_id = gm.make_maker(marker_options);

        // Ẩn map_wrap sau khi load xog (làm khuất tầm nhìn, không hide)
        $map_wrap.css({ top: '-101%'});

        function hide_map () {
            $map_wrap.fadeOut(1000);
        }
        function show_map(mode) {
            if (!mode) {
                map_mode = HOUSE_POSITION_MODE;
            } else {
                map_mode = mode;
            }
            $map_wrap.css('top', 0).hide().fadeIn(1000);
        }

        // Đóng bản đồ
        $cancel_position.click (function () {
            hide_map();
        });

        // Chấp nhận tọa độ
        $submit_position.click(function () {
            hide_map();

            if (map_mode === HOUSE_POSITION_MODE) {
                var co = GMap.get_marker(maker_id).getPosition();
                $house_position.val(co.toString());
            }
        });

        $map_sheller.click(function (e) {
            e.preventDefault();
            show_map();

            GMap.get(map_id).panTo(GMap.get_marker(maker_id).getPosition());
        });
        $house_position.dblclick(function () {
            $map_sheller.click();
        });

        // Nhắp phải trên bản đồ để thiết lập marker
        GMap.listen(map_id, "rightclick", function (e) {
            GMap.get_marker(maker_id).setPosition(e.latLng);
            GMap.get(map_id).panTo(e.latLng);
        });

        GMap.queue(function () {
            google.maps.event.addListener(GMap.get_marker(maker_id), "dragend", function () {
                var point = GMap.get_marker(maker_id).getPosition();
                GMap.get(map_id).panTo(point);
            });
        });

        $("#remove-anchor").click (function () {
            $anchor_id.val(-1);
            $anchor_name.val('');

            return false;
        });

        // Đăng nhà trọ
        $form.submit(function () {
            var valid = false;
            if (!$house_name.validate()) {
                __.error('Vui lòng nhập tên nhà trọ hợp lệ', $house_name);
            } else if (!$house_address.validate()) {
                __.error('Vui lòng nhập địa chỉ nhà trọ hợp lệ!', $house_address);
            } else if (!$intro.validate()) {
                __.error('Bạn vui lòng cung cấp một đoạn giới thiệu ngắn về nhà trọ của mình');
            } else {
                valid = true;
            }

            return valid;
        });
    });
}(window.jQuery, window.jqExt, window.GMap));